using System.Text;
using Neighbors.Database;
using PRTelegramBot.Attributes;
using PRTelegramBot.Extensions;
using PRTelegramBot.InlineButtons;
using PRTelegramBot.Interface;
using PRTelegramBot.Models;
using PRTelegramBot.Models.InlineButtons;
using PRTelegramBot.Utils;
using Telegram.Bot;
using Telegram.Bot.Types;
using Telegram.Bot.Types.ReplyMarkups;

namespace Neighbors.Commands;

public class EditMyInformation
{
    [ReplyMenuHandler("Редактировать")]
    [SlashHandler("/my_edit")]
    public static async Task ReplyMyInformation(ITelegramBotClient botClient, Update update)
    {
        FlatRepository flatRepository = new FlatRepository();

        var myFlat = await flatRepository.GetNeighborsByChatIdAsync(update.Message.Chat.Id);
        var message = "Что нужно отредактировать?";
        if (message == null)
            await PRTelegramBot.Helpers.Message.Send(botClient, update, "Ваших данных нет в базе.");

        var option = new OptionMessage();
        var menu = new List<KeyboardButton>
        {
            new KeyboardButton("Имя"),
            new KeyboardButton("Телефон"),
        };

        var mainMenu = MenuGenerator.ReplyKeyboard(2, menu);
        option.MenuReplyKeyboardMarkup = mainMenu;

        update.RegisterStepHandler(new StepTelegram(StepEdit, new StepCache()));
        await PRTelegramBot.Helpers.Message.Send(botClient, update, message, option);
    }

    private static async Task StepEdit(ITelegramBotClient botClient, Update update)
    {
        switch (update.Message?.Text)
        {
            case "Имя":
                update.RegisterStepHandler(new StepTelegram(StepEditName, new StepCache()));
                await PRTelegramBot.Helpers.Message.Send(botClient, update, "Напишите новое имя:");
                break;
            case "Телефон":
                update.RegisterStepHandler(new StepTelegram(StepEditPhone, new StepCache()));
                await PRTelegramBot.Helpers.Message.Send(botClient, update, "Напишите новый телефон в формате \"79991234567\":");
                break;
            default:
                await PRTelegramBot.Helpers.Message.Send(botClient, update, "Неизвестная команда");
                break;
        }

        //Получаем текущий обработчик
        var handler = update.GetStepHandler<StepTelegram>();
        //Записываем имя пользователя в кэш 
        handler!.GetCache<StepCache>().Flat = update.Message.Text;
    }

    private static async Task StepEditName(ITelegramBotClient botClient, Update update)
    {
        FlatRepository flatRepository = new FlatRepository();

        var result = await flatRepository.UpdateNameNeighborsByChatIdAsync(update.Message.Chat.Id, update.Message.Text);

        //Получаем текущий обработчик
        var handler = update.GetStepHandler<StepTelegram>();
        //Записываем имя пользователя в кэш 
        handler!.GetCache<StepCache>().Flat = update.Message.Text;
        //Последний шаг
        update.ClearStepUserHandler();
        await PRTelegramBot.Helpers.Message.Send(botClient, update, result);
    }
    private static async Task StepEditPhone(ITelegramBotClient botClient, Update update)
    {
        FlatRepository flatRepository = new FlatRepository();

        var result = await flatRepository.UpdatePhoneNeighborsByChatIdAsync(update.Message.Chat.Id, update.Message.Text);

        //Получаем текущий обработчик
        var handler = update.GetStepHandler<StepTelegram>();
        //Записываем имя пользователя в кэш 
        handler!.GetCache<StepCache>().Flat = update.Message.Text;
        //Последний шаг
        update.ClearStepUserHandler();
        await PRTelegramBot.Helpers.Message.Send(botClient, update, result);
    }   
}